home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1999 March
/
EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso
/
earcd
/
devel
/
vbcc-68k-src
/
machines
/
amiga68k
/
libsrc
/
_main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-01-01
|
3KB
|
89 lines
/* _main()-Routine fuer vbcc-Amiga-Version */
/* initialisiert stdin, stdout, stderr etc. */
/* 05-Oct-98 phx _ctors/_dtors support */
/* 06-Feb-99 phx _ctors/_dtors support for */
/* vlink 0.6c (1st word is -1) */
/* MATH_IEEE definieren, wenn die MathIeee-Libraries benutzt werden sollen */
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <libraries/dos.h>
#include <proto/dos.h>
FILE *stdin,*stdout,*stderr,*_firstfile=0,*_lastfile=0;
extern int main(int, char **);
extern BPTR _stdin,_stdout,_stderr;
extern __far void (*_ctors[])(),(*_dtors[])();
#ifdef MATH_IEEE
#include <proto/exec.h>
struct Library *MathIeeeDoubBasBase,*MathIeeeDoubTransBase,*MathIeeeSingBasBase;
#endif
void _main(int argc, char **argv)
{
void (**ctors)() = _ctors;
stdin=(FILE *)malloc(sizeof(FILE));
stdout=(FILE *)malloc(sizeof(FILE));
stderr=(FILE *)malloc(sizeof(FILE));
if(!stdin||!stdout||!stderr) exit(EXIT_FAILURE);
stdin->filehandle=(char*)_stdin;
stdin->flags=_READABLE;if(IsInteractive(_stdin)) stdin->flags|=_UNBUF;
stdout->filehandle=(char*)_stdout;
stdout->flags=_WRITEABLE;if(IsInteractive(_stdout)) stdout->flags|=_LINEBUF;
stderr->filehandle=(char*)_stderr;
stderr->flags=_WRITEABLE;if(IsInteractive(_stderr)) stderr->flags|=_UNBUF;
stdin->pointer=stdout->pointer=stderr->pointer=0;
stdin->base=stdout->base=stderr->base=0;
stdin->count=stdout->count=stderr->count=0;
stdin->bufsize=stdout->bufsize=stderr->bufsize=0;
stdin->prev=0;stdin->next=stdout;
stdout->prev=stdin;stdout->next=stderr;
stderr->prev=stdout;stderr->next=0;
_firstfile=stdin;_lastfile=stderr;
#ifdef MATH_IEEE
if(!(MathIeeeSingBasBase=OpenLibrary("mathieeesingbas.library",37L)))
exit(EXIT_FAILURE);
if(!(MathIeeeDoubBasBase=OpenLibrary("mathieeedoubbas.library",37L)))
exit(EXIT_FAILURE);
if(!(MathIeeeDoubTransBase=OpenLibrary("mathieeedoubtrans.library",37L)))
exit(EXIT_FAILURE);
#endif
if(ctors++) while(*ctors) (*ctors++)(); /* call constructors */
exit(main(argc,argv));
}
/* Wie sieht das genau aus? Das ist eine Asm-Routine */
extern void _exit();
struct __exitfuncs *__firstexit;
/* exit()-Routine fuer vbcc-Amiga-Version */
void exit(int returncode)
{
void (**dtors)() = _dtors;
int i;
struct __exitfuncs *p=__firstexit;
/* atexit-Routinen starten */
while(p){p->func();p=p->next;}
if (dtors) {
for (i=1; *dtors[i]; i++);
while (--i) (*dtors[i])(); /* call destructors */
}
#ifdef MATH_IEEE
if(MathIeeeDoubTransBase) CloseLibrary(MathIeeeDoubTransBase);
if(MathIeeeDoubBasBase) CloseLibrary(MathIeeeDoubBasBase);
if(MathIeeeSingBasBase) CloseLibrary(MathIeeeSingBasBase);
#endif
/* alle offenen Files schliessen */
while(_firstfile&&!fclose(_firstfile));
/* allen Speicher freigeben */
_freemem();
_exit(returncode);
}